import processing.core.*;

public class Otus {
	
	Logiikka p;
	int x, y;
	int ynosto;
	int w, h;
	int nousuMaara;
	int ehtiNousta;
	boolean nousu, lasku, poppable, lyomable, lyoty, alhaalla, up;
	int timer1, timer2;
	int elotimer, randomi, vert, ylaaika;
	int fr;//frekvenssi 0-fr ms
	PImage kuva1;
	
	public Otus(int x, int y, Logiikka parent)
	{
		this.x = x;
		this.y = y;
		this.p = parent;
		this.w= 200;
		this.h=250; 
		this.nousuMaara = -180;
		this.ehtiNousta = 0;
		alhaalla = true;
		poppable = lyomable = nousu = lasku = lyoty = up = false;
		this.elotimer = 0;
		this.randomi = 2000+(int) p.random(13000);
		this.vert = 0;
		this.fr = 50000;
		this.ylaaika = 2000;
		this.kuva1 = p.loadImage("hamster.png");
	}
	
	public void elaa()
	{
		
		//nostaa hamsterin jos ehdot toteutuvat
		this.pop(1000-p.getVaikeus());
		//if(p.millis()>1000)
		//laskee hamsterin jos ehdot toteutuvat
		this.lyoty(500-p.getVaikeus()/5);
		this.drawOtus();
		up();
		this.vaikeus();
	}
	
	public void vaikeus()
	{
		this.ylaaika = 2000-2*p.getVaikeus();
		setFr(15000-p.getVaikeus()*20);
	}
	
	public void up()
	{
		elotimer = p.millis() - vert;
		if(up && elotimer > ylaaika)
		{
			lyoty = true;
			p.hp--;
		}
	}
	
	public void setFr(int frekvenssi)
	{
		this.fr = frekvenssi;
	}
	
	public void esiin()
	{
		this.poppable = true;
	}
	
	public void lopetaPop()
	{
		this.poppable = false;
		this.nousu = false;
	}
	
	public void lopetaLasku()
	{
		//this.poppable = true; testaamiseen
		this.lasku = false;
		this.lyomable = false;
		this.lyoty = false;
		this.alhaalla = true;
	}
	
	public void pop(int aika)
	{
		if(poppable)
		{
			lyomable = true;
			
			if(!nousu)
			{
				timer1 = p.millis();
				this.randomi = 3000+(int) p.random(fr);//aika seuraavaan spawniin
				this.vert = p.millis();
				alhaalla = false;
				nousu = true;
			}
			float kulunut = p.millis()-timer1;//paljonko nousun alusta on kulunut aikaa
			if(kulunut <= aika)
			{
				this.ynosto = (int) (nousuMaara*(1-(aika-kulunut)/aika));
				this.ehtiNousta = ynosto;
			}
			else
			{
				up = true;
				vert = p.millis();
				lopetaPop();
				PApplet.println("noustiin");
			}	
		}
		else if(alhaalla){
			elotimer = p.millis()-vert;
			PApplet.println(elotimer+" ja "+ randomi);
			if(elotimer > randomi)
			{
				this.esiin();
			}
		}
	}
	
	public void lyoty(int aika)
	{
		if(lyomable && lyoty)
		{
			up = false;
			lopetaPop();
			if(!lasku)
			{
				timer2 = p.millis();
				lasku = true;
			}
			float kulunut = p.millis()-timer2;
			if(kulunut <= aika)
			{
				this.ynosto = (int) (ehtiNousta*(aika-kulunut)/aika);
			}
			else
			{
				lopetaLasku();
			}
		}
	}
	
	public void drawOtus()
	{
		p.fill(0);
		p.image(kuva1, x, y+ynosto, w, h);
		//p.rect(x, y+ynosto, w, h);
	}
	
	public void nouse(int nopeus)
	{
		this.ynosto -= nopeus;
	}
	
	public void laske(int nopeus)
	{
		this.ynosto += nopeus;
	}
	
	public void liiku(int x2, int y2)
	{
		this.x = x2;
		this.y = y2;
	}
	
	public boolean osuuko(int xt, int yt)
	{
		//PApplet.println("osuuko");
		if(alhaalla)
			return false;
		if(xt > x && xt < x+w && yt > y+ynosto && yt < y+h+ynosto)
		{
			PApplet.println("osuu!");
			return true;
		}
		return false;
	}
}
